#ifndef TYPES_H_
#define TYPES_H_

#define LOG_FILE "../LOG.txt"

#include "auxiliaire.h"
#include <pthread.h>

/*____________________________________________________________________________*/

typedef enum _s_processus{ InStop, InRun, InKill_proc } s_processus;

typedef enum _cmd_mmu{ InPt, InAdd, InFlush, InKill_mmu } cmd_mmu;

typedef enum _cmd_os{ InCreate, InListe, InEnd, InKill_os } cmd_os;

/*____________________________________________________________________________*/

/*LA TABLE DES CADRES*/

typedef struct _frame_table_entry
{
  bool is_bound ;/*!< \brief vaut 1 si le cadre est affecté à un processus et 0 sinon*/
  int proc_id ;/*!< stocke le numéro du processus il est lié*/
} Frame_table_entry;

typedef struct _frame_table {
    int frame_num ;
    struct _frame_table_entry *fte;
} Frame_table;

/*____________________________________________________________________________*/

/*!
 *
 * \brief LA TABLE DES PAGES,verifier si ce cadre est libre ou occupé
 */
typedef struct _page_table_entry
{
    int frame_num ;
    bool dirty ;/*!< vaut 1 s'il y a eu un accès en écriture*/
    bool valid ;
} Page_table_entry;

typedef struct _page_table
{
    int page_num ;
    struct _page_table_entry *pte;
} Page_table;
/*!
 *
 *  \brief LA TABLE de TLB, pour vérifier si le TLB existe ou non chaque fois on lance un processus
 * si cette page a été déjà demandée, l'adresse du cadre a déjà été calculé et le résultat a été conservé dans le TLB
 * la MMU peut alors répondre sans passer par la table des pages du processus. il néxiste quún seul TLB.
 * il faudra réinitialiser cette table à chaque fois que l'on change de processus.
 */

typedef struct _TLB_entry{
	int page_num;
	int frame_num;
}TLB_entry;

typedef struct _TLB_table{
	int entry_num;
	int entry_pointer;
	TLB_entry *tbe;
} TLB_table;
/*____________________________________________________________________________*/

/*la table des processus*/
typedef struct _processus_simple
{
	int pid;
    FILE* tuyau[2];
    int etat;
    int nb_instruction;
    Page_table page_table;
    struct _processus_simple *suivant;
} myPS;

typedef struct _table_processus
{
   myPS *tete;
   myPS *encours;
} myTP;

/*................................................................*/


/* la table de MMU*/
typedef struct proc_mmu
{
    Page_table page_table;
    FILE *tuyau[2];
} Mmu;
/*____________________________________________________________________________*/
/*la table de swap*/
typedef struct _swap_entry
{
    int proc_id;
    int page_num;
};

typedef struct _swap
{
    int swap_num;
    struct _swap_entry *swe;
}Swap;




/*______________________________________________________________________________*/
typedef struct _donnees
{
	myTP tableProc;
	Frame_table tableCadres;

	int tuer[BUFFER_SIZE];
	int nTuer;

	int nCreer;

	bool detruire;

	int pagesParProc;

	FILE *MMU_in, *MMU_out;

	FILE *log;

} Donnees;

/*____________________________________________________________________________*/

cmd_mmu str2cmd_mmu(char* str);

s_processus str2s_processus(char* str);

cmd_os  str2cmd_os(char* str);

/*!
 *  \brief creation la table des cadres
 * void dialogue_utilisteur( _processus_simple myPS);
 * @param   *bitmap  TODO faire la description
 * @param   cadre_max  le maximale de cadre
 */
void creation_table_cadre( Frame_table *bitmap,int cadre_max);

/*creation la table des pages*/
void creation_table_page(Page_table *table, int page_max);

void initDonnees(Donnees *d, int pagesParProc, int nCadres);

/*____________________________________________________________________________*/

#endif /* TYPES_H_ */
